﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Almacen
{
    public partial class frmNotaPedido : System.Web.UI.Page
    {
        private const string KEYNOTA = "nota";
        [Dependency]
        public IProductoBL productoService { get; set; }
        [Dependency]
        public INotaPedidoBL notaPedidoBL { get; set; }

        
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {
                var opc = Request.QueryString["opc"];
                var idNota = Request.QueryString["id"];

                if (opc!=null && opc=="nuevo")
                {
                    var nuevaNota = new NotaPedido()
                    {
                        FechaPedido = DateTime.Now
                    };

                    BindingNota(nuevaNota);
                    ViewState["opc"] = opc;
                }
                
                else if (opc!=null && opc=="editar" && idNota!=null)
                {
                    var nota = notaPedidoBL.GetFromNotaPEdidoById(Int32.Parse(idNota));

                    //txtNroCompra.Text = nota.CodigoNotaPedido;
                    //txtComentario.Text = nota.ComentarioPedido;
                    //txtFecha.Text = nota.FechaPedido.ToString();
                    //txtComentario.ReadOnly = true;
                    //txtNroCompra.ReadOnly = true;
                    //txtFecha.ReadOnly = true;
                    cbEstado.SelectedValue = nota.EstadoAlmacen;
                    
                    BindingNota(nota);
                    ViewState["opc"] = opc;
                }
                else if (opc == "ver" && idNota!= null)
                {
                    
                    var identificador = int.Parse(idNota);
                    var nota = notaPedidoBL.GetFromNotaPEdidoById(identificador);
                    UpdatePanel1.Visible = true;
                    txtNroCompra.Text = nota.CodigoNotaPedido;
                    txtComentario.Text = nota.ComentarioPedido;
                    txtFecha.Text = nota.FechaPedido.ToString();
                    txtComentario.ReadOnly = true;
                    txtNroCompra.ReadOnly = true;
                    txtFecha.ReadOnly = true;
                    cbEstado.Enabled = false;
                    btnGuardar.Enabled = false;

                }


                else if (opc != null && opc == "delete" && idNota != null)
                {
                    var id = Int32.Parse(idNota);

                    notaPedidoBL.RemoveNotaPedido(id);
                    Response.Redirect("frmListNotaPedido.aspx");
                }
            }
        }

        private NotaPedido GetNota()
        {
            return Cache.Get(KEYNOTA) as NotaPedido;
        }

        private void BindingNota(NotaPedido notaPedido)
        {
            txtCodigo.Text = notaPedido.Id.ToString();
            txtFecha.Text = notaPedido.FechaPedido.ToShortDateString();

            ;

            if (notaPedido.FechaPedido != null)
            {
                txtComentario.Text = notaPedido.ComentarioPedido;
            }
            notaPedido.Total = notaPedido.DetalleNotaPedido.Sum(dn => dn.Monto);
            lvDetalleNota.DataSource = notaPedido.DetalleNotaPedido;
            lvDetalleNota.DataBind();

            var lblTotal = lvDetalleNota.FindControl("lblTotal") as Label;

            if (lblTotal != null)
            {
                lblTotal.Text = notaPedido.Total.ToString();
            }
            Cache.Insert(KEYNOTA, notaPedido);
        }

        public IQueryable<Producto> GetProductos([Control("txtCriterio")] string criterio)
        {
            return productoService.GetFromProductosByCriterio(criterio).AsQueryable();
        }
        #region ya no mas boton update
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            var nota = GetNota();

            foreach (var row in lvDetalleNota.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPecio = row.FindControl("txtPrecio") as TextBox;

                nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPecio.Text);
            }
            BindingNota(nota);
        }
        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            var nota = GetNota();

            foreach (var row in lvDetalleNota.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPecio = row.FindControl("txtPrecio") as TextBox;

                nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPecio.Text);
            }
            BindingNota(nota);
        }
        #endregion
        protected void lvDetalleNota_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName=="QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                var nota = GetNota();

                var detalle = nota.DetalleNotaPedido.
                    Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle!=null)
                {
                    nota.DetalleNotaPedido.Remove(detalle);
                }
                BindingNota(nota);
            }
            else if (e.CommandName =="ActualizarDetalle")
            {
                var nota = GetNota();

                foreach (var row in lvDetalleNota.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPecio = row.FindControl("txtPrecio") as TextBox;

                    nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                    nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPecio.Text);
                }
                BindingNota(nota);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var nota = GetNota();
            //nota.FechaPedido = DateTime.Parse(txtFecha.Text);

            //var nota = GetNota();

            nota.FechaPedido = DateTime.Now;


            if (nota != null)
            {
                if (ViewState["opc"].ToString() == "nuevo")
                {

                    nota.EstadoConfeccion = cbEstado.SelectedValue;
                    nota.ComentarioPedido = txtComentario.Text;

                    nota.Estado = true;
                    notaPedidoBL.AddNotaPEdido(nota);
                    Response.Redirect("~/Almacen/frmListNotaPedido.aspx");
                    ScriptManager.
                        RegisterClientScriptBlock(this,
                        this.GetType(), "alertMessage", "alert('Nota Pedido Registrada..!!')", true);

                }
                else if (ViewState["opc"].ToString() == "editar")
                {

                    nota.EstadoConfeccion = cbEstado.SelectedValue;
                    nota.Estado = true;
                    nota.ComentarioPedido = txtComentario.Text;
                    notaPedidoBL.UpdateNotaPedido(nota);
                    Response.Redirect("~/Almacen/frmListNotaPedido.aspx");
                    ScriptManager.
                        RegisterClientScriptBlock(this,
                        this.GetType(), "alertMessage", "alert('Nota Pedido Editada..!!')", true);

                }
            }

           
                  
        }


        public NotaPedido GetDoc()
        {
            var id = Request.QueryString["id"];

            var identificador = int.Parse(id);

            return notaPedidoBL.GetFromNotaPEdidoById(identificador);
        }

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());


                var nota = GetNota();

                var existe = nota.DetalleNotaPedido
                    .Where(dp => dp.IdProducto == productoId).SingleOrDefault();

                if (existe != null)
                {
                    existe.Cantidad += 1;
                }
                else
                {
                    var producto = productoService
                        .GetFromProductosById((productoId));

                    var newDetalle = new DetalleNotaPedido()
                    {
                        IdNotaPedido = nota.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        PrecioUnit = producto.Precio,
                        Cantidad = 1
                    };

                    nota.DetalleNotaPedido.Add(newDetalle);
                }
                //nota.Total = nota.DetalleNotaPedido.Sum(i => i.Monto);
                BindingNota(nota);
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListNotaPedido.aspx");

        }
    }
}